package com.srmt.document.feishu.internal.table.impl.normal;

import com.lark.oapi.service.docx.v1.model.*;
import com.srmt.document.exception.TableException;
import com.srmt.document.feishu.internal.table.model.TableContext;
import com.srmt.feishu.client.FeishuClient;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 普通表格结构操作
 *
 * 封装所有与Normal Table结构修改相关的操作，包括：
 * - 单元格合并
 * - 单元格取消合并
 *
 * @author srmt
 * @since 3.0.0
 */
public class NormalTableStructureOps {

    private static final Logger logger = LoggerFactory.getLogger(NormalTableStructureOps.class);

    private final FeishuClient client;

    public NormalTableStructureOps(FeishuClient client) {
        if (client == null) {
            throw new IllegalArgumentException("客户端不能为null");
        }
        this.client = client;
    }

    /**
     * 合并单元格
     *
     * @param context 表格上下文
     * @param startRow 起始行索引（1-based）
     * @param startCol 起始列索引（1-based）
     * @param endRow 结束行索引（1-based）
     * @param endCol 结束列索引（1-based）
     * @throws TableException 操作失败时抛出
     */
    public void mergeCells(TableContext context, int startRow, int startCol,
                          int endRow, int endCol) throws TableException {
        logger.debug("合并普通表格中的单元格[{},{} 到 {},{}]",
                    startRow, startCol, endRow, endCol);

        try {
            String tableBlockId = context.getTableBlockId();
            String docId = context.getDocumentId();

            // 构建合并单元格请求
            // 对外接口从1开始，内部实现从0开始，需要转换
            MergeTableCellsRequest mergeReq = MergeTableCellsRequest.newBuilder()
                    .rowStartIndex(startRow - 1)
                    .rowEndIndex(endRow)  // 飞书API使用半开区间
                    .columnStartIndex(startCol - 1)
                    .columnEndIndex(endCol)  // 飞书API使用半开区间
                    .build();

            UpdateBlockRequest updateReq = UpdateBlockRequest.newBuilder()
                    .blockId(tableBlockId)
                    .mergeTableCells(mergeReq)
                    .build();

            PatchDocumentBlockReq patchReq = PatchDocumentBlockReq.newBuilder()
                    .documentId(docId)
                    .blockId(tableBlockId)
                    .documentRevisionId(-1)
                    .updateBlockRequest(updateReq)
                    .build();

            // patchDocumentBlock现在直接返回Block对象，失败时抛出FeishuApiException
            client.docx().patchDocumentBlock(patchReq);

            logger.info("成功合并单元格[{},{} 到 {},{}]",
                       startRow, startCol, endRow, endCol);

        } catch (TableException e) {
            throw e;
        } catch (Exception e) {
            throw new TableException("合并单元格失败: " + e.getMessage());
        }
    }

    /**
     * 取消合并单元格
     *
     * @param context 表格上下文
     * @param startRow 起始行索引（1-based）
     * @param startCol 起始列索引（1-based）
     * @param endRow 结束行索引（1-based，未使用）
     * @param endCol 结束列索引（1-based，未使用）
     * @throws TableException 操作失败时抛出
     */
    public void unmergeCells(TableContext context, int startRow, int startCol,
                            int endRow, int endCol) throws TableException {
        logger.debug("取消合并普通表格中的单元格[{},{} 到 {},{}]",
                    startRow, startCol, endRow, endCol);

        try {
            String tableBlockId = context.getTableBlockId();
            String docId = context.getDocumentId();

            // 构建取消合并单元格请求
            // UnmergeTableCellsRequest 只需要指定合并区域的左上角单元格
            UnmergeTableCellsRequest unmergeReq = UnmergeTableCellsRequest.newBuilder()
                    .rowIndex(startRow)
                    .columnIndex(startCol)
                    .build();

            UpdateBlockRequest updateReq = UpdateBlockRequest.newBuilder()
                    .blockId(tableBlockId)
                    .unmergeTableCells(unmergeReq)
                    .build();

            PatchDocumentBlockReq patchReq = PatchDocumentBlockReq.newBuilder()
                    .documentId(docId)
                    .blockId(tableBlockId)
                    .documentRevisionId(-1)
                    .updateBlockRequest(updateReq)
                    .build();

            // patchDocumentBlock现在直接返回Block对象，失败时抛出FeishuApiException
            client.docx().patchDocumentBlock(patchReq);

            logger.info("成功取消合并单元格[{},{} 到 {},{}]",
                       startRow, startCol, endRow, endCol);

        } catch (TableException e) {
            throw e;
        } catch (Exception e) {
            throw new TableException("(unmerge cells: " + e.getMessage());
        }
    }
}
